package pl.grabar.clinic.core.dao;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 * Generyczny interfejs realizujacy DAO.
 *
 * @author db
 * @param <Type> typ na ktorym operuje DAO
 */
public interface Dao<Type extends Serializable> {

	static final String SORT_ORDER_ASCENDING = "ASC";
	static final String SORT_ORDER_DESCENDING = "DESC";
	
	/**
	 * Wyszukuje obiekt na podstawie identyfikatora.
	 *
	 * @param id identyfikator obiektu
	 * @return znaleziony obiekt
	 * @throws DaoException w przypadku bledu dostepu do danych
	 */
	Type findById(Serializable id) throws SQLException;

	/**
	 * Wyszukuje wszystkie obiekty danego typu.
	 *
	 * @return znaleziona kolekcje
	 * @throws DaoException w przypadku bledu dostepu do danych
	 */
	List<Type> findAll() throws SQLException;

	/**
	 * Wyszukuje 1 stronę obiektów danego typu. 
	 * 
	 * @param pageNumber numer strony do wyswietlenia
	 * @param pageSize ilosc elementow jednorazowo wyswietlanych na stronie
	 * @param sortProperty nazwa pola, po ktorym odbywa sie testowanie
	 * @param sortOrder porzadek sortowania
	 * @return czesciowa liste obiektow danego typu
	 * @throws DaoException w przypadku bledu dostepu do danych
	 */
	List<Type> findAll(Integer pageNumber, Integer pageSize, String sortProperty, String sortOrder) throws SQLException;
	
	List<Type> findAll(Integer pageNumber, Integer pageSize, String sortProperty, String sortOrder, Map<String, String> filter) throws SQLException;
	
	/**
	 * Oblicza ilosc obiektow danej klasy.
	 * 
	 * @return liczba obiektow
	 * @throws DaoException w przypadku bledu dostepu do danych 
	 */
	Long countAll() throws SQLException;
	
	Long countAll(Map<String, String> filter) throws SQLException;
	
	/**
	 * Zapisuje obiekt. Nie moze on znajdowac sie wczesniej wsrod
	 * przechowywanych obiektow.
	 *
	 * @param objectToSave obiekt do zapisania
	 * @throws DaoException w przypadku bledu dostepu do danych
	 */
	void save(Type objectToSave) throws SQLException;

	/**
	 * Aktualizuje przechowywany obiekt.
	 *
	 * @param transientObject przechowywany obiekt
	 * @throws DaoException w przypadku bledu dostepu do danych
	 */
	void update(Type transientObject) throws SQLException;

	/**
	 * Usuwa przechowywany obiekt.
	 *
	 * @param transientObject przechowywany obiekt
	 * @throws DaoException w przypadku bledu dostepu do danych
	 */
	void delete(Type transientObject) throws SQLException;
}
